package dondeestamitransporte.manejadorPersistencia;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.TimeZone;

import com.google.android.gms.maps.model.LatLng;

import dondeestamitransporte.mundo.MundoPasajero;
import dondeestamitransporte.mundo.RutaPasajero;
import dondeestamitrasnporte.protocolo.Estadistica;
import dondeestamitrasnporte.protocolo.Paradero;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;


public class Persistencia extends SQLiteOpenHelper {


	public static final boolean PRUEBA = true;
	private static final int DATABASE_VERSION = 1;
	private static final String DATABASE_NAME = "donde_esta_mi_transporte";

	//-------------------------------------------------------------------
	// TABLA RUTAS DEL PASAJERO
	//-------------------------------------------------------------------
	private static final String RUTAS_PASAJERO_NOMBRE_TABLA = "rutas_pasajero";

	//Nombre TEXT
	private static final String RUTAS_PASAJERO_NOMBRE_RUTA = "nombre_ruta";

	//Nombre del Paradero
	private static final String NOMBRE_PARADERO_PASAJERO = "nombre_paradero";


	//Hora esperada (ejemplo 14:32) TEXT
	private static final String RUTAS_PASAJERO_HORA_ESPERADA = "hora_esperada";

	//Tiempo de desplazamiento INT (en minutos)
	private static final String RUTAS_PASAJERO_TIEMPO_DESPLAZAMIENTO = "tiempo_despazamiento";

	//Dias regulares de la ruta (ejemplo 0,1,4,5,7  o NULL si no es regular para ningun dia) TEXT
	private static final String RUTAS_PASAJERO_DIAS_REGULARES = "dias_regulares_pasajero";

	private static final String RUTAS_PASAJERO_CREATE = "CREATE TABLE IF NOT EXISTS " + RUTAS_PASAJERO_NOMBRE_TABLA + " ( " + RUTAS_PASAJERO_NOMBRE_RUTA + " TEXT  PRIMARY KEY, " + NOMBRE_PARADERO_PASAJERO + " TEXT, " + RUTAS_PASAJERO_HORA_ESPERADA + " TEXT, " + RUTAS_PASAJERO_TIEMPO_DESPLAZAMIENTO + " INT, " + RUTAS_PASAJERO_DIAS_REGULARES + " TEXT );";




	//-------------------------------------------------------------------
	// TABLA COMPANHEROS DE RUTA Y CHOFERES DEL PASAJERO
	//-------------------------------------------------------------------
	private static final String COMPANHEROS_PASAJERO_NOMBRE_TABLA = "companheros_pasajero";

	//Nombre del cmpanhero TEXT
	private static final String COMPANHEROS_PASAJERO_NOMBRE_PASAJERO = "nombre_pasajero";

	//Tipo del companhero INT. 1 si es companhero y 2 si es chofer
	private static final String COMPANHEROS_PASAJERO_TIPO_PASAJERO = "tipo_pasajero";

	private static final String COMPANHEROS_PASAJERO_CREATE = "CREATE TABLE IF NOT EXISTS " + COMPANHEROS_PASAJERO_NOMBRE_TABLA + " ( " + RUTAS_PASAJERO_NOMBRE_RUTA + " TEXT, " + COMPANHEROS_PASAJERO_NOMBRE_PASAJERO + " TEXT, " + COMPANHEROS_PASAJERO_TIPO_PASAJERO + " INT, " +  "FOREIGN KEY (" + RUTAS_PASAJERO_NOMBRE_RUTA + ") REFERENCES " + RUTAS_PASAJERO_NOMBRE_TABLA + "(" + RUTAS_PASAJERO_NOMBRE_RUTA + ") );";


	//-------------------------------------------------------------------
	// TABLA DE LA SEMANA DEL PASAJERO
	//-------------------------------------------------------------------

	private static final String SEMANA_PASAJERO_NOMBRE_TABLA = "semana_pasajero";

	//El numero de la semana arrancando en 0 INT
	private static final String SEMANA_PASAJERO_DIA = "semana_dia";

	private static final String SEMANA_PASAJERO_RUTA_1 = "semana_pasajero_ruta_1";

	//El tiempoo en minutos de la alarma INT
	private static final String SEMANA_PASAJERO_ALARMA_1 = "semana_pasajero_alarma_1";
	private static final String SEMANA_PASAJERO_RUTA_2 = "semana_pasajero_ruta_2";
	private static final String SEMANA_PASAJERO_ALARMA_2 = "semana_pasajero_alarma_2";

	private static final String SEMANA_PASAJERO_CREATE = "CREATE TABLE IF NOT EXISTS " + SEMANA_PASAJERO_NOMBRE_TABLA + " ( " + SEMANA_PASAJERO_DIA + " INT  PRIMARY KEY, " + SEMANA_PASAJERO_RUTA_1 + " TEXT NULL, " + SEMANA_PASAJERO_ALARMA_1 + " INT, " + SEMANA_PASAJERO_RUTA_2 + " TEXT NULL, " + SEMANA_PASAJERO_ALARMA_2 + " INT, FOREIGN KEY (" + SEMANA_PASAJERO_RUTA_1 + ") REFERENCES " + RUTAS_PASAJERO_NOMBRE_TABLA + "(" + RUTAS_PASAJERO_NOMBRE_RUTA + "), " +  "FOREIGN KEY (" + SEMANA_PASAJERO_RUTA_2 + ") REFERENCES " + RUTAS_PASAJERO_NOMBRE_TABLA + "(" + RUTAS_PASAJERO_NOMBRE_RUTA + ")  );";



	//-------------------------------------------------------------------
	// TABLA DONDE ESTA LA ULTIMA ACTUALIZACION
	//-------------------------------------------------------------------


	private static final String ULTIMA_ACTUALIZACION_DE_SEMANA_PASAJERO_NOMBRE_TABLA = "ultima_actualizacion_pasajero";

	//la ultima actualizacion se modela asi  MM:DD:S donde ss el dia de la semana. de 0 a 6. TEXT
	private static final String ULTIMA_FECHA_PASAJERO = "ultimo_actualizacion";

	private static final String ULTIMA_ACTUALIZACION_DE_SEMANA_PASAJERO_CREATE = "CREATE TABLE IF NOT EXISTS " + ULTIMA_ACTUALIZACION_DE_SEMANA_PASAJERO_NOMBRE_TABLA + " ( " + ULTIMA_FECHA_PASAJERO + " TEXT NULL );" ;

	//-------------------------------------------------------------------
	// TABLA DONDE ESTA LAS RUTAS RECIBIDAS
	//-------------------------------------------------------------------


	private static final String RUTAS_RECIBIDAS_NOMBRE_TABLA = "rutas_recibidas_pasajero";


	private static final String NUMERO_DEL_QUE_ENVIO_PASAJERO = "numero_del_que_envio";


	private static final String DATOS_ENVIO_PASAJERO = "datos_envio";

	private static final String RUTAS_RECIBIDAS_PASAJERO_CREATE = "CREATE TABLE IF NOT EXISTS " + RUTAS_RECIBIDAS_NOMBRE_TABLA + " ( " + NUMERO_DEL_QUE_ENVIO_PASAJERO + " VARCHAR, "  + DATOS_ENVIO_PASAJERO + " TEXT   );" ;



	//-------------------------------------------------------------------
	// TABLA DONDE ESTAN LOS PARADEROS
	//-------------------------------------------------------------------


	private static final String PARADEROS_NOMBRE_TABLA = "paraderos_pasajero";

	private static final String NOMBRE_MOSTRAR_PARADERO_PASAJERO = "nombre_mostrar";


	private static final String LATITUD_PARADERO_PASAJERO = "latitud";

	private static final String LONGITUD_PARADERO_PASAJERO = "longitud";

	private static final String PARADEROS_PASAJERO_CREATE =  "CREATE TABLE IF NOT EXISTS " + PARADEROS_NOMBRE_TABLA + " ( " + NOMBRE_PARADERO_PASAJERO + " TEXT PRIMARY KEY, " +  NOMBRE_MOSTRAR_PARADERO_PASAJERO +" TEXT,  " + LATITUD_PARADERO_PASAJERO + " DOUBLE, " + LONGITUD_PARADERO_PASAJERO + " DOUBLE );";


	//-------------------------------------------------------------------
	// TABLA DONDE ESTA LA RELACION DE RUTAS CON PARADEROS
	//-------------------------------------------------------------------


	private static final String RUTAS_Y_PARADEROS_NOMBRE_TABLA = "rutas_y_paraderos";

	private static final String RUTAS_Y_PARADEROS_POSICION = "posicion";

	private static final String RUTAS_Y_PARADEROS_PASAJERO_CREATE =  "CREATE TABLE IF NOT EXISTS " + RUTAS_Y_PARADEROS_NOMBRE_TABLA + " ( " + RUTAS_PASAJERO_NOMBRE_RUTA + " TEXT, " + NOMBRE_PARADERO_PASAJERO + " TEXT, " + RUTAS_Y_PARADEROS_POSICION + " INT, FOREIGN KEY (" + RUTAS_PASAJERO_NOMBRE_RUTA + ") REFERENCES " + RUTAS_PASAJERO_NOMBRE_TABLA + "(" + RUTAS_PASAJERO_NOMBRE_RUTA + ") , FOREIGN KEY (" + NOMBRE_PARADERO_PASAJERO + ") REFERENCES " + PARADEROS_NOMBRE_TABLA + "(" + NOMBRE_PARADERO_PASAJERO + ") );";


	//-------------------------------------------------------------------
	// TABLA DONDE ESTAN LOS DATOS PARA DIBUJAR LAS RUTAS
	//-------------------------------------------------------------------


	private static final String DIBUJAR_RUTA_NOMBRE_TABLA = "dibujar_ruta";

	private static final String DIBUJAR_RUTA_POSICION = "posicion_dibujar";

	private static final String DIBUJAR_RUTA_PASAJERO_CREATE =  "CREATE TABLE IF NOT EXISTS " + DIBUJAR_RUTA_NOMBRE_TABLA + " ( " + RUTAS_PASAJERO_NOMBRE_RUTA + " TEXT,  " + LATITUD_PARADERO_PASAJERO + " DOUBLE, " + LONGITUD_PARADERO_PASAJERO + " DOUBLE,  " + DIBUJAR_RUTA_POSICION + " INT, FOREIGN KEY (" + RUTAS_PASAJERO_NOMBRE_RUTA + ") REFERENCES " + RUTAS_PASAJERO_NOMBRE_TABLA + "(" + RUTAS_PASAJERO_NOMBRE_RUTA + ") );";



	//-------------------------------------------------------------------
	// TABLA DE ESTADISTICAS
	//-------------------------------------------------------------------
	private static final String ESTADISTICAS_PASAJERO_NOMBRE_TABLA = "estadistica_pasajero";

	//los datos tomados en el formato MM:DD:S:HH:MM TEXT
	private static final String DATO_TOMADO_PASAJERO = "dato_tomado";

	private static final String ESTADISTICAS_PASAJERO_CREATE = "CREATE TABLE IF NOT EXISTS " + ESTADISTICAS_PASAJERO_NOMBRE_TABLA + " ( " + RUTAS_PASAJERO_NOMBRE_RUTA + " TEXT, " + NOMBRE_PARADERO_PASAJERO + " TEXT, " + DATO_TOMADO_PASAJERO + " TEXT, " +  "FOREIGN KEY (" + RUTAS_PASAJERO_NOMBRE_RUTA + ") REFERENCES " + RUTAS_PASAJERO_NOMBRE_TABLA + "(" + RUTAS_PASAJERO_NOMBRE_RUTA + ") );";




	//-------------------------------------------------------------------
	//-------------------------------------------------------------------
	//-------------------------------------------------------------------
	//-------------------------------------------------------------------
	//
	// iNICIO CLASE
	//
	//-------------------------------------------------------------------
	//-------------------------------------------------------------------
	//-------------------------------------------------------------------
	//-------------------------------------------------------------------


	/**
	 * 
	 * @param context
	 */
	public Persistencia(Context context) 
	{
		super(context, DATABASE_NAME, null, DATABASE_VERSION);

	}


	@Override
	public void onCreate(SQLiteDatabase db) 
	{

		db.execSQL(RUTAS_PASAJERO_CREATE);
		db.execSQL(COMPANHEROS_PASAJERO_CREATE);
		db.execSQL(SEMANA_PASAJERO_CREATE);
		db.execSQL(ULTIMA_ACTUALIZACION_DE_SEMANA_PASAJERO_CREATE);
		db.execSQL(RUTAS_RECIBIDAS_PASAJERO_CREATE);
		db.execSQL(PARADEROS_PASAJERO_CREATE);
		db.execSQL(RUTAS_Y_PARADEROS_PASAJERO_CREATE);
		db.execSQL(ESTADISTICAS_PASAJERO_CREATE);
		db.execSQL(DIBUJAR_RUTA_PASAJERO_CREATE);










		for(int i = 0; i < 7; i++)
		{
			String query = "SELECT * FROM " +  SEMANA_PASAJERO_NOMBRE_TABLA + " WHERE " + SEMANA_PASAJERO_DIA + "=" + i+";";
			Cursor cursor = db.rawQuery(query, null);
			if(cursor==null || !cursor.moveToFirst())
			{
				String query2 = "INSERT INTO " +  SEMANA_PASAJERO_NOMBRE_TABLA + " VALUES ("+i+",NULL,0,NULL,0);";
				db.execSQL(query2);
			}
			if(cursor!=null)
			{
				cursor.close();
			}
		}




	}


	@Override
	public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) 
	{

		//	    db.execSQL("DROP TABLE IF EXISTS " + RUTAS_PASAJERO_NOMBRE_TABLA);
		//	    db.execSQL("DROP TABLE IF EXISTS " + COMPANHEROS_PASAJERO_NOMBRE_TABLA);
		//	    db.execSQL("DROP TABLE IF EXISTS " + SEMANA_PASAJERO_NOMBRE_TABLA);
		//	    db.execSQL("DROP TABLE IF EXISTS " + ESTADISTICAS_PASAJERO_NOMBRE_TABLA);
		//	    db.execSQL("DROP TABLE IF EXISTS " + ULTIMA_ACTUALIZACION_DE_SEMANA_PASAJERO_NOMBRE_TABLA);
		//	    onCreate(db);

	}


	/**
	 * Metodo que agrega una nueva ruta a la base de datos
	 * @param ruta
	 */
	public void agregarRuta(RutaPasajero ruta)
	{


		SQLiteDatabase db = getWritableDatabase();
		String diasRegulares = "";
		int[] semanaRuta = ruta.getSemanaDeLaRuta();
		for(int i = 0; i < semanaRuta.length;i++)
		{
			if(semanaRuta[i]>0)
			{
				if(diasRegulares.equalsIgnoreCase(""))
				{
					diasRegulares = "" +i;
				}
				else
				{
					diasRegulares = diasRegulares + ", " + i;
				}
			}
		}

		String query2 = "INSERT INTO " +  RUTAS_PASAJERO_NOMBRE_TABLA + " VALUES ('" + ruta.getNombre()+"', '" + ruta.getNombreParadero()+"', '" + ruta.getHoraEsperada() + "', " + ruta.getTiempoDesplazamiento() +  ", '" + diasRegulares + "');";  
		Cursor c = db.rawQuery(query2, null);
		c.moveToFirst();
		c.close();


		ArrayList<Estadistica> esta = new ArrayList<Estadistica>();
		Paradero para = new Paradero(new LatLng(0, 0), esta, ruta.getNombreParadero());

		agregarNuevoParadero(ruta.getNombre(), para, -1);

		ArrayList<String> companheros = new ArrayList<String>();
		ArrayList<String> choferes = new ArrayList<String>();

		for(int i = 0; i < companheros.size(); i++)
		{
			String query3 = "INSERT INTO " +  COMPANHEROS_PASAJERO_NOMBRE_TABLA + " VALUES ('" + ruta.getNombre() + "', '" + companheros.get(i) + "', 1);";

			Cursor c1 = db.rawQuery(query3, null);
			c1.moveToFirst();
			c1.close();
		}
		for(int i = 0; i < choferes.size(); i++)
		{
			String query3 = "INSERT INTO " +  COMPANHEROS_PASAJERO_NOMBRE_TABLA + " VALUES ('" + ruta.getNombre() + "', '" + choferes.get(i) + "', 2);";

			Cursor c2 = db.rawQuery(query3, null);
			c2.moveToFirst();
			c2.close();
		}

		//los datos tomados en el formato MM:DD:S:HH:MM TEXT

		Calendar calendar = Calendar.getInstance(TimeZone.getDefault());
		int diaDeLaSemanaActual = (calendar.get(Calendar.DAY_OF_WEEK)-1);
		int mes = calendar.get(calendar.MONTH);
		int dia = calendar.get(calendar.DAY_OF_MONTH);

		String estadistica = mes +":"+ dia +":"+diaDeLaSemanaActual+":"+ruta.getHoraEsperada();

		String query = "INSERT INTO " +  ESTADISTICAS_PASAJERO_NOMBRE_TABLA + " VALUES ('" + ruta.getNombre() + "', '" + ruta.getNombreParadero() + "','" + estadistica + "');";

		Cursor c3 = db.rawQuery(query, null);
		c3.moveToFirst();
		c3.close();




	}

	/**
	 * Metodo que elimina rutas de la base de datos
	 * @param ruta
	 */
	public  void eliminarRuta(String nombreRuta, String nombreParadero)
	{
		SQLiteDatabase db = getWritableDatabase();

		String query = "UPDATE " +  SEMANA_PASAJERO_NOMBRE_TABLA + " SET " + SEMANA_PASAJERO_RUTA_1 +  "= NULL , " + SEMANA_PASAJERO_ALARMA_1 +  "= 0   WHERE " + SEMANA_PASAJERO_RUTA_1 +"='" + nombreRuta + "';";
		Cursor c3 = db.rawQuery(query, null);
		c3.moveToFirst();
		c3.close();

		String query4 = "UPDATE " +  SEMANA_PASAJERO_NOMBRE_TABLA + " SET " + SEMANA_PASAJERO_RUTA_2 +  "= NULL , " + SEMANA_PASAJERO_ALARMA_2 +  "= 0   WHERE " + SEMANA_PASAJERO_RUTA_2 +"='" + nombreRuta + "';";
		Cursor c4 = db.rawQuery(query4, null);
		c4.moveToFirst();
		c4.close();

		String query8 = "DELETE FROM " +  RUTAS_Y_PARADEROS_NOMBRE_TABLA + " WHERE " + RUTAS_PASAJERO_NOMBRE_RUTA + "='" + nombreRuta + "_" + nombreParadero + "';";
		Cursor c =db.rawQuery(query8, null);
		c.moveToFirst();
		c.close();
		
		String query10 = "DELETE FROM " +  PARADEROS_NOMBRE_TABLA + " WHERE " + NOMBRE_PARADERO_PASAJERO + "='" + nombreRuta + "_" + nombreParadero + "';";
		Cursor c10 =db.rawQuery(query10, null);
		c10.moveToFirst();
		c10.close();

		String query9 = "DELETE FROM " +  DIBUJAR_RUTA_NOMBRE_TABLA + " WHERE " + RUTAS_PASAJERO_NOMBRE_RUTA + "='" + nombreRuta + "';";
		Cursor c9 =db.rawQuery(query9, null);
		c9.moveToFirst();
		c9.close();

		String query1 = "DELETE FROM " +  COMPANHEROS_PASAJERO_NOMBRE_TABLA + " WHERE " + RUTAS_PASAJERO_NOMBRE_RUTA + "='" + nombreRuta + "';";
		Cursor c1 = db.rawQuery(query1, null);
		c1.moveToFirst();
		c1.close();

		String query2 = "DELETE FROM " +  RUTAS_PASAJERO_NOMBRE_TABLA + "  WHERE " + RUTAS_PASAJERO_NOMBRE_RUTA +"='" +nombreRuta + "' ;";
		Cursor c2 = db.rawQuery(query2, null);
		c2.moveToFirst();
		c2.close();




	}

	/**
	 * Metodo que actualiza una ruta
	 * @param ruta
	 */
	public  void actualizarRuta(RutaPasajero ruta, String nombreRutaVieja, String paraderoViejo)
	{



		SQLiteDatabase db = getWritableDatabase();
		String diasRegulares = "";
		int[] semanaRuta = ruta.getSemanaDeLaRuta();
		for(int i = 0; i < semanaRuta.length;i++)
		{
			if(semanaRuta[i]>0)
			{
				if(diasRegulares.equalsIgnoreCase(""))
				{
					diasRegulares = "" +i;
				}
				else
				{
					diasRegulares = diasRegulares + ", " + i;
				}
			}
		}


		//		String query1 = "DELETE FROM " +  COMPANHEROS_PASAJERO_NOMBRE_TABLA + " WHERE " + RUTAS_PASAJERO_NOMBRE_RUTA + "='" + nombreRutaVieja + "';";
		//		Cursor c =db.rawQuery(query1, null);
		//		c.moveToFirst();
		//		c.close();

		String query1 = "DELETE FROM " +  RUTAS_Y_PARADEROS_NOMBRE_TABLA + " WHERE " + RUTAS_PASAJERO_NOMBRE_RUTA + "='" + nombreRutaVieja + "';";
		Cursor c =db.rawQuery(query1, null);
		c.moveToFirst();
		c.close();

		String query2 = "UPDATE " +  RUTAS_PASAJERO_NOMBRE_TABLA + " SET " + RUTAS_PASAJERO_NOMBRE_RUTA +  "='"+ ruta.getNombre()+"', " + NOMBRE_PARADERO_PASAJERO +  "='"+ ruta.getNombreParadero()+ "'," + RUTAS_PASAJERO_TIEMPO_DESPLAZAMIENTO +  "="+ ruta.getTiempoDesplazamiento()+", " + RUTAS_PASAJERO_DIAS_REGULARES +  "='"+diasRegulares+"'  WHERE " + RUTAS_PASAJERO_NOMBRE_RUTA +"='" + nombreRutaVieja + "' ;";
		Cursor c1 = db.rawQuery(query2, null);
		c1.moveToFirst();
		c1.close();

		String nombreRef = ruta.getNombre() + "_" + ruta.getNombreParadero();

		query2 = "UPDATE " +  PARADEROS_NOMBRE_TABLA + " SET "  + NOMBRE_PARADERO_PASAJERO +  "='"+ nombreRef+ "', "  + NOMBRE_MOSTRAR_PARADERO_PASAJERO +  "='"+ ruta.getNombreParadero()+"'  WHERE " + NOMBRE_PARADERO_PASAJERO +"='" + nombreRutaVieja + "_" + paraderoViejo+ "' ;";
		c = db.rawQuery(query2, null);
		c.moveToFirst();
		c.close();








		ArrayList<String> companheros = new ArrayList<String>();
		ArrayList<String> choferes = new ArrayList<String>();

		//		for(int i = 0; i < companheros.size(); i++)
		//		{
		//			String query3 = "INSERT INTO " +  COMPANHEROS_PASAJERO_NOMBRE_TABLA + " VALUES ('" + ruta.getNombre() + "', '" + companheros.get(i) + "', 1);";
		//
		//			Cursor c3 = db.rawQuery(query3, null);
		//			c3.moveToFirst();
		//			c3.close();
		//		}
		//		for(int i = 0; i < choferes.size(); i++)
		//		{
		//			String query3 = "INSERT INTO " +  COMPANHEROS_PASAJERO_NOMBRE_TABLA + " VALUES ('" + ruta.getNombre() + "', '" + choferes.get(i) + "', 2);";
		//
		//			Cursor c3 = db.rawQuery(query3, null);
		//			c3.moveToFirst();
		//			c3.close();
		//		}



	}

	/**
	 * Metodo que actualiza la semana y las alarmas
	 * @param ruta
	 */
	public  void actualizarSemana( String[][] miSemanaPasajero, int[][] alarmas)
	{

		SQLiteDatabase db = getWritableDatabase();

		for(int i = 0; i<7;i++)
		{
			String nombreRuta1 = miSemanaPasajero[i][0];
			if(nombreRuta1!=null)
			{
				nombreRuta1 = "'" + nombreRuta1 +"'";
			}
			else
			{
				nombreRuta1="NULL";
			}

			String nombreRuta2 = miSemanaPasajero[i][1];
			if(nombreRuta2!=null)
			{
				nombreRuta2 = "'" + nombreRuta2 +"'";
			}
			else
			{
				nombreRuta2="NULL";
			}


			String query = "UPDATE " +  SEMANA_PASAJERO_NOMBRE_TABLA + " SET " + SEMANA_PASAJERO_RUTA_1 +  "="+ nombreRuta1 +", " + SEMANA_PASAJERO_RUTA_2 +  "="+ nombreRuta2 +", " + SEMANA_PASAJERO_ALARMA_1 +  "="+ alarmas[i][0] +", " + SEMANA_PASAJERO_ALARMA_1 +  "="+ alarmas[i][1] +"  WHERE " + SEMANA_PASAJERO_DIA +"=" + i + ";";
			Cursor c3 = db.rawQuery(query, null);
			c3.moveToFirst();
			c3.close();
		}




	}

	/**
	 * Metodo que inicializa el pasajero
	 * @param ruta
	 */
	public  void cargar( MundoPasajero pasajero)
	{
		SQLiteDatabase db = getReadableDatabase();

		ArrayList<RutaPasajero> rutasPasajero = new ArrayList<RutaPasajero>();

		String[][] miSemanaPasajero = new String[7][2];

		int[][] alarmas = new int[7][2];


		String query = "SELECT * FROM " +  RUTAS_PASAJERO_NOMBRE_TABLA +";";
		String query3 = "SELECT * FROM " +  SEMANA_PASAJERO_NOMBRE_TABLA+";";

		Cursor cursor = db.rawQuery(query, null);

		if (cursor != null ) 
		{
			boolean progreso = cursor.moveToFirst();
			while  (progreso) 
			{
				ArrayList<String> companheros = new ArrayList<String>();
				ArrayList<String> choferes = new ArrayList<String>();

				String nombreRuta = cursor.getString(cursor.getColumnIndex(RUTAS_PASAJERO_NOMBRE_RUTA));
				String nombreParadero = cursor.getString(cursor.getColumnIndex(NOMBRE_PARADERO_PASAJERO));
				String horaEsperada = cursor.getString(cursor.getColumnIndex(RUTAS_PASAJERO_HORA_ESPERADA));
				int tiempoDesplazamiento = cursor.getInt(cursor.getColumnIndex(RUTAS_PASAJERO_TIEMPO_DESPLAZAMIENTO));
				String diasRegulares = cursor.getString(cursor.getColumnIndex(RUTAS_PASAJERO_DIAS_REGULARES));


				int[] semanaDeLaRuta = new int[7];

				String[] temp = diasRegulares.split(",");
				if(!temp[0].equalsIgnoreCase("NULL") && !temp[0].equalsIgnoreCase(""))
				{
					for(int i = 0; i < temp.length; i++)
					{
						int a = Integer.parseInt(temp[0]);
						semanaDeLaRuta[a] = 1;
					}
				}

				String query2 = "SELECT * FROM " +  COMPANHEROS_PASAJERO_NOMBRE_TABLA + " WHERE " + RUTAS_PASAJERO_NOMBRE_RUTA + "='" + nombreRuta + "';" ;
				Cursor cursor2 = db.rawQuery(query2, null);
				if (cursor2 != null ) 
				{
					boolean progreso2 = cursor2.moveToFirst();
					while(progreso2)
					{
						String nombreCompanhero = cursor2.getString(cursor2.getColumnIndex(COMPANHEROS_PASAJERO_NOMBRE_PASAJERO));
						int tipo = cursor2.getInt(cursor2.getColumnIndex(COMPANHEROS_PASAJERO_TIPO_PASAJERO));

						if(tipo == 1)
						{
							companheros.add(nombreCompanhero);
						}
						else
						{
							choferes.add(nombreCompanhero);
						}

						progreso2 = cursor2.moveToNext();

					}
					cursor2.close();
				}

				RutaPasajero ruta = new RutaPasajero(nombreRuta,nombreParadero, companheros, choferes, horaEsperada, tiempoDesplazamiento, semanaDeLaRuta);
				rutasPasajero.add(ruta);
				progreso = cursor.moveToNext();
			}
			cursor.close();
		}

		Cursor cursor3 = db.rawQuery(query3, null);

		if (cursor3 != null ) 
		{
			int i = 0;
			boolean progreso3 = cursor3.moveToFirst();
			while  (progreso3) 
			{
				String nombreRuta1 = cursor3.getString(cursor3.getColumnIndex(SEMANA_PASAJERO_RUTA_1));
				int alarma1 = cursor3.getInt(cursor3.getColumnIndex(SEMANA_PASAJERO_ALARMA_1));

				String nombreRuta2 = cursor3.getString(cursor3.getColumnIndex(SEMANA_PASAJERO_RUTA_2));
				int alarma2 = cursor3.getInt(cursor3.getColumnIndex(SEMANA_PASAJERO_ALARMA_2));

				miSemanaPasajero[i][0] = nombreRuta1;
				miSemanaPasajero[i][1] = nombreRuta2;

				alarmas[i][0] = alarma1;
				alarmas[i][0] = alarma2;


				progreso3 = cursor3.moveToNext();
				i++;
			}
			cursor3.close();


		}



		MundoPasajero.getInstance().alarmas = alarmas;
		MundoPasajero.getInstance().miSemanaPasajero = miSemanaPasajero;
		MundoPasajero.getInstance().rutasPasajero = rutasPasajero;


		if(PRUEBA && !MundoPasajero.getInstance().datosCargados)
		{



			poblar();



		}




	}

	public static void poblar()
	{
		try
		{
			String nombreDeLaRuta = "Carpooling de Pedro";
			String nombredelParadero = "Esquina de la Novena";
			MundoPasajero.getInstance().eliminarrRuta(MundoPasajero.getInstance().darPosicionRuta(nombreDeLaRuta));
			ArrayList<String> companheros = new ArrayList<String>();
			companheros.add("Juan Felipe");
			companheros.add("El Pato");

			ArrayList<String> choferes = new ArrayList<String>();
			choferes.add("Pedro");

			int[] semanaDeLaRuta = {0,1,0,1,0,1,0};

			RutaPasajero r = new RutaPasajero(nombreDeLaRuta, nombredelParadero, companheros, choferes, "5:35", 10, semanaDeLaRuta);
			MundoPasajero.getInstance().agregarRuta(r);

			ArrayList<Estadistica> esta = new ArrayList<Estadistica>();
			Paradero para = new Paradero(new LatLng(4.709916, -74.032901), esta, nombredelParadero);
			MundoPasajero.getInstance().actualizarCoordenadasParadero(nombreDeLaRuta, para);

			ArrayList<LatLng> dibujo = new ArrayList<LatLng>();

			dibujo.add(new LatLng(4.726267, -74.034323));
			dibujo.add(new LatLng(4.725497, -74.032391));
			dibujo.add(new LatLng(4.722653, -74.032434));
			dibujo.add(new LatLng(4.715746, -74.032799));
			dibujo.add(new LatLng(4.711627, -74.032890));
			dibujo.add(new LatLng(	4.707149, -74.033014));
			dibujo.add(new LatLng(	4.699028,-74.033067));
			dibujo.add(new LatLng(	4.696761,-74.033153));

			//ESQUINA 116 CON 9
			dibujo.add(new LatLng(	4.694152,-74.034612));

			dibujo.add(new LatLng(	4.693298,-74.035129));
			dibujo.add(new LatLng(	4.694418,-74.037264));
			dibujo.add(new LatLng(	4.694853,-74.036990));
			dibujo.add(new LatLng(	4.694450,-74.035493));
			dibujo.add(new LatLng(	4.693648,-74.033503));
			dibujo.add(new LatLng(	4.693348,-74.033412));
			dibujo.add(new LatLng(	4.688744,-74.034907));
			dibujo.add(new LatLng(	4.686296,-74.035358));
			//ESQUINA 116 CON 7
			dibujo.add(new LatLng(	4.684970,-74.035787));


			dibujo.add(new LatLng(	4.680040,-74.038190));
			dibujo.add(new LatLng(	4.677645,-74.040057));
			dibujo.add(new LatLng(	4.675699,-74.040572));
			dibujo.add(new LatLng(	4.674533,-74.041581));
			dibujo.add(new LatLng(	4.673303,-74.042879));

			//ESQUINA 86 CON 7
			dibujo.add(new LatLng(	4.666460,-74.046291));

			dibujo.add(new LatLng(	4.664941,-74.046913));
			dibujo.add(new LatLng(	4.661252,-74.050367));
			dibujo.add(new LatLng(	4.658739,-74.052985));

			//ESQUINA 75 CON 7
			dibujo.add(new LatLng(	4.657616,-74.053876));
			dibujo.add(new LatLng(	4.656087,-74.054820));
			dibujo.add(new LatLng(	4.654879,-74.055507));
			dibujo.add(new LatLng(	4.654066,-74.055753));
			dibujo.add(new LatLng(	4.651382,-74.057491));
			dibujo.add(new LatLng(	4.650698,-74.058318));
			dibujo.add(new LatLng(	4.646752,-74.060335));
			dibujo.add(new LatLng(	4.645298,-74.061322));
			dibujo.add(new LatLng(	4.644346,-74.061654));
			dibujo.add(new LatLng(	4.639512,-74.062899));
			dibujo.add(new LatLng(	4.636015,-74.063736));
			dibujo.add(new LatLng(	4.632989,-74.063854));
			dibujo.add(new LatLng(	4.631396,-74.064197));
			dibujo.add(new LatLng(	4.629439,-74.064830));





			MundoPasajero.getInstance().agregarDibujo(nombreDeLaRuta, dibujo);


			MundoPasajero.getInstance().agregarNuevoParadero(nombreDeLaRuta,new Paradero(new LatLng( 4.694152, -74.034612), esta, "Paradero 1") , 0);

			MundoPasajero.getInstance().agregarNuevoParadero(nombreDeLaRuta,new Paradero(new LatLng( 4.684970, -74.035787), esta, "Paradero 2") , 1);

			MundoPasajero.getInstance().agregarNuevoParadero(nombreDeLaRuta,new Paradero(new LatLng(  4.666460, -74.046291), esta, "Paradero 3") , 2);

			MundoPasajero.getInstance().agregarNuevoParadero(nombreDeLaRuta,new Paradero(new LatLng( 4.657616,-74.053876), esta, "Paradero 4") , 3);







		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
	}


	/**
	 * Metodo que agraga una nueva estadistica, calcula la hora esperada de salida y la actualiza.
	 * @param nombreRuta
	 * @param estadistica
	 */
	public void agregarEstadistica(String nombreRuta, String nombreParadero, String estadistica)
	{
		SQLiteDatabase db = getWritableDatabase();

		String nombreRef = nombreRuta + "_" + nombreParadero;
		db.execSQL(ESTADISTICAS_PASAJERO_CREATE);

		String query = "INSERT INTO " +  ESTADISTICAS_PASAJERO_NOMBRE_TABLA + " VALUES ('" + nombreRuta + "', '" + nombreRef + "', '" + estadistica + "');";

		Cursor c3 = db.rawQuery(query, null);
		c3.moveToFirst();
		c3.close();



		db= getReadableDatabase();

		String query2 = "SELECT " + DATO_TOMADO_PASAJERO + " FROM " + ESTADISTICAS_PASAJERO_NOMBRE_TABLA + " WHERE " + RUTAS_PASAJERO_NOMBRE_RUTA + "='" + nombreRuta + "' AND " + NOMBRE_PARADERO_PASAJERO + "='" + nombreRef + "' ;";


		Cursor cursor2 = db.rawQuery(query2, null);

		int promedio = -1;
		int contador = 0;

		if (cursor2 != null ) 
		{
			boolean progreso2 = cursor2.moveToFirst();
			while(progreso2)
			{
				String estadisticaTomada = cursor2.getString(cursor2.getColumnIndex(DATO_TOMADO_PASAJERO));

				String[] temp = estadisticaTomada.split(":");

				int horas = Integer.parseInt(temp[3]);

				int minutos = Integer.parseInt(temp[4]);

				int nuevoDato = horas*60 + minutos;

				if(promedio==-1)
				{
					promedio = nuevoDato;
					contador++;
				}
				else
				{
					promedio = (promedio*contador + nuevoDato)/(contador + 1);
					contador++;
				}

				progreso2 = cursor2.moveToNext();

			}
			cursor2.close();
		}

		int horas = promedio/60;

		int minutos = promedio%60;
		if(minutos<0)
		{
			minutos=minutos+60;
		}

		String horaNueva = horas+ ":" + minutos;



		db= getWritableDatabase();

		String query3 = "UPDATE " +  RUTAS_PASAJERO_NOMBRE_TABLA + " SET " + RUTAS_PASAJERO_HORA_ESPERADA + "='" + horaNueva +"'  WHERE " + RUTAS_PASAJERO_NOMBRE_RUTA +"='" + nombreRuta+ "' ;";
		Cursor c =  db.rawQuery(query3, null);
		c.moveToFirst();
		c.close();




	}



	public String darHoraEsperadaDeSalida(String nombreRuta)
	{
		String respuesta = null;
		SQLiteDatabase db= getReadableDatabase();
		String query2 = "SELECT " + RUTAS_PASAJERO_HORA_ESPERADA + " FROM " + RUTAS_PASAJERO_NOMBRE_TABLA + " WHERE " + RUTAS_PASAJERO_NOMBRE_RUTA + "='" + nombreRuta + "' ;";

		Cursor cursor2 = db.rawQuery(query2, null);




		if (cursor2 != null ) 
		{
			if(cursor2.moveToFirst())
			{
				respuesta = cursor2.getString(cursor2.getColumnIndex(RUTAS_PASAJERO_HORA_ESPERADA));

			}
			cursor2.close();
		}





		return respuesta;
	}


	/**
	 * Metodo que devuelve la ultima actualizacion de la semana
	 * @return
	 */
	public String darUltimaActualizacion()
	{
		SQLiteDatabase db = getReadableDatabase();
		String query = "SELECT * FROM " + ULTIMA_ACTUALIZACION_DE_SEMANA_PASAJERO_NOMBRE_TABLA + ";";

		String respuesta = null;
		Cursor cursor = db.rawQuery(query, null);

		if (cursor != null ) 
		{
			if(cursor.moveToFirst())
			{
				respuesta = cursor.getString(cursor.getColumnIndex(ULTIMA_FECHA_PASAJERO));

			}
			cursor.close();
		}



		return respuesta;
	}

	/**
	 * Metodo que fija cambia la fecha actualizacion en la base de datos
	 * @return
	 */
	public void actializarUltimaFecha()
	{

		Calendar c = Calendar.getInstance(TimeZone.getDefault());
		int diaDeLaSemanaActual = (c.get(Calendar.DAY_OF_WEEK)-1);
		int mes = c.get(c.MONTH);
		int dia = c.get(c.DAY_OF_MONTH);

		diaDeLaSemanaActual = (diaDeLaSemanaActual -1)%7;
		if(diaDeLaSemanaActual<0)
		{
			diaDeLaSemanaActual = diaDeLaSemanaActual+7;
		}

		//la ultima actualizacion se modela asi  MM:DD:S donde ss el dia de la semana. de 0 a 6. TEXT


		SQLiteDatabase db = getWritableDatabase();

		String hora = mes+":"+dia+":"+diaDeLaSemanaActual;

		String query0 = "DELETE FROM " +  ULTIMA_ACTUALIZACION_DE_SEMANA_PASAJERO_NOMBRE_TABLA + ";";
		Cursor c1 = db.rawQuery(query0, null);
		c1.moveToFirst();
		c1.close();

		String query = "INSERT INTO " +  ULTIMA_ACTUALIZACION_DE_SEMANA_PASAJERO_NOMBRE_TABLA + " VALUES ('" + hora + "');";
		Cursor c3 = db.rawQuery(query, null);
		c3.moveToFirst();
		c3.close();







	}


	public boolean YaTieneCoordenadasElParadero(String nombreRuta, String para)
	{
		boolean respuesta = false;


		Paradero paradero = darParadero(nombreRuta, para);

		if(( paradero.getCoordenadas().latitude!=0 && paradero.getCoordenadas().longitude!=0) )
		{
			respuesta = true;
		}

		return respuesta;



	}

	public boolean YaExisteEseParadero(String nombreRuta, String para)
	{
		boolean respuesta = false;


		Paradero paradero = darParadero(nombreRuta, para);

		if(paradero != null )
		{
			respuesta = true;
		}

		return respuesta;
	}


	public void agregarNuevoParadero(String nombreRuta, Paradero para, int posicion)
	{
		SQLiteDatabase db = getWritableDatabase();

		String nombreRef = nombreRuta + "_" + para.getNombre();


		String query2 = "INSERT INTO " +  PARADEROS_NOMBRE_TABLA + " VALUES ( '" + nombreRef+"', '" + para.getNombre()+"', " +para.getCoordenadas().latitude+ ", " +para.getCoordenadas().longitude + " );";  

		Cursor c = db.rawQuery(query2, null);
		c.moveToFirst();
		c.close();


		

		query2 = "INSERT INTO " +  RUTAS_Y_PARADEROS_NOMBRE_TABLA + " VALUES ('" + nombreRuta+"', '" + nombreRef + "',  "+ posicion + " );";  
		c = db.rawQuery(query2, null);
		c.moveToFirst();
		c.close();




		ArrayList<Estadistica> esta = para.getEstadisticas();

		for(int i = 0; i < esta.size();i++)
		{

			agregarEstadistica(nombreRuta, para.getNombre(), esta.get(i).darString());
		}


	}

	public void agregarParaderosAlternos(String nombreRuta, ArrayList<Paradero> paraderos)
	{


		for(int i = 0; i < paraderos.size();i++)
		{

			if(YaExisteEseParadero(nombreRuta,paraderos.get(i).getNombre()))
			{
				paraderos.get(i).setNombre(paraderos.get(i).getNombre() + "(" + nombreRuta + ")");
			}

			agregarNuevoParadero(nombreRuta, paraderos.get(i), i);
			agregarEstadisticasDeParadero(nombreRuta, paraderos.get(i));
			actualizarCoordenadasParadero(nombreRuta,paraderos.get(i));

		}

	}


	public void agregarEstadisticasDeParadero(String nombreRuta, Paradero para)
	{
		ArrayList<Estadistica> esta = para.getEstadisticas();

		for(int i = 0; i < esta.size();i++)
		{

			agregarEstadistica(nombreRuta, para.getNombre(), esta.get(i).darString());
		}
	}

	public void actualizarCoordenadasParadero( String nombreRuta, Paradero para)
	{
		SQLiteDatabase db = getWritableDatabase();


		String nombreRef = nombreRuta + "_" + para.getNombre();
		
		String query2 = "UPDATE " +  PARADEROS_NOMBRE_TABLA + " SET " + LATITUD_PARADERO_PASAJERO +  "="+ para.getCoordenadas().latitude+", " + LONGITUD_PARADERO_PASAJERO +  "="+ para.getCoordenadas().longitude+ " WHERE " + NOMBRE_PARADERO_PASAJERO +"='" + nombreRef + "' ;";
		if(para.getCoordenadas().latitude!=0 && para.getCoordenadas().longitude!=0)
		{


			Cursor c1 = db.rawQuery(query2, null);
			c1.moveToFirst();
			c1.close();
		}


	}



	public boolean SePuedeDibujar(String ruta)
	{

		boolean respuesta = false;
		SQLiteDatabase db= getReadableDatabase();
		String query2 = "SELECT " + RUTAS_PASAJERO_NOMBRE_RUTA + " FROM " + DIBUJAR_RUTA_NOMBRE_TABLA + " WHERE " + RUTAS_PASAJERO_NOMBRE_RUTA + "='" + ruta + "' ;";

		Cursor cursor2 = db.rawQuery(query2, null);


		if (cursor2 != null ) 
		{
			if(cursor2.moveToFirst())
			{
				respuesta = true;

			}
			cursor2.close();
		}





		return respuesta;

	}

	public void agregarDibujo(String nombreRuta, ArrayList<LatLng> coordenadas)
	{

		SQLiteDatabase db= getReadableDatabase();

		for(int i = 0; i < coordenadas.size();i++)
		{


			String query2 = "INSERT INTO " +  DIBUJAR_RUTA_NOMBRE_TABLA + " VALUES ('" + nombreRuta+"', " +coordenadas.get(i).latitude + ", " +coordenadas.get(i).longitude + " , "+i +" );";  
			Cursor c = db.rawQuery(query2, null);
			c.moveToFirst();
			c.close();

		}

	}


	public ArrayList<LatLng> darDibujo(String nombreRuta)
	{
		ArrayList<LatLng> respuesta = new ArrayList<LatLng>();
		SQLiteDatabase db= getReadableDatabase();


		String query = "SELECT * FROM " + DIBUJAR_RUTA_NOMBRE_TABLA + " WHERE " + RUTAS_PASAJERO_NOMBRE_RUTA + "='" + nombreRuta + "' ORDER BY " + DIBUJAR_RUTA_POSICION + "  ;";



		Cursor cursor = db.rawQuery(query, null);

		if (cursor != null ) 
		{
			boolean progreso = cursor.moveToFirst();
			while  (progreso) 
			{

				double lat = cursor.getDouble(cursor.getColumnIndex(LATITUD_PARADERO_PASAJERO));
				double lon = cursor.getDouble(cursor.getColumnIndex(LONGITUD_PARADERO_PASAJERO));

				respuesta.add(new LatLng(lat, lon));
				progreso = cursor.moveToNext();
			}
			cursor.close();
		}


		return respuesta;
	}



	public Paradero darParadero(String nombreRuta,String nombreParadero)
	{
		Paradero respuesta=null;
		SQLiteDatabase db= getReadableDatabase();

		String nombreRef = nombreRuta + "_" + nombreParadero;
		String query2 = "SELECT * FROM " + PARADEROS_NOMBRE_TABLA + " WHERE " + NOMBRE_PARADERO_PASAJERO + "='" + nombreRef + "' ;";

		Cursor cursor = db.rawQuery(query2, null);

		if (cursor != null ) 
		{

			if(cursor.moveToFirst())
			{

				double lat = cursor.getDouble(cursor.getColumnIndex(LATITUD_PARADERO_PASAJERO));
				double lon = cursor.getDouble(cursor.getColumnIndex(LONGITUD_PARADERO_PASAJERO));
				String nombre = cursor.getString(cursor.getColumnIndex(NOMBRE_MOSTRAR_PARADERO_PASAJERO));
				LatLng coordenadas = new LatLng(lat, lon);
				ArrayList<Estadistica> esta = darEstadisticas(nombreRuta, nombreParadero);

				respuesta = new Paradero(coordenadas, esta, nombre);

			}
			cursor.close();
		}

		return respuesta;

	}


	public ArrayList<Paradero> darParaderos(String nombreRuta)
	{
		ArrayList<Paradero> respuesta = new ArrayList<Paradero>();
		SQLiteDatabase db= getReadableDatabase();


		String query = "SELECT * FROM " + RUTAS_Y_PARADEROS_NOMBRE_TABLA + " WHERE " + RUTAS_PASAJERO_NOMBRE_RUTA + "='" + nombreRuta + "' ORDER BY " + RUTAS_Y_PARADEROS_POSICION + "  ;";

		Cursor cursor = db.rawQuery(query, null);

		if (cursor != null ) 
		{
			boolean progreso = cursor.moveToFirst();
			while  (progreso) 
			{

				Paradero para = darParadero(nombreRuta, cursor.getString(cursor.getColumnIndex(NOMBRE_PARADERO_PASAJERO)).split("_")[1]);

				respuesta.add(para);
				progreso = cursor.moveToNext();
			}
			cursor.close();
		}


		return respuesta;
	}

	public ArrayList<Estadistica> darEstadisticas(String nombreRuta, String nombreParadero)
	{
		ArrayList<Estadistica> respuesta = new ArrayList<Estadistica>();

		SQLiteDatabase db= getReadableDatabase();

		String query2 = "SELECT " + DATO_TOMADO_PASAJERO + " FROM " + ESTADISTICAS_PASAJERO_NOMBRE_TABLA + " WHERE " + RUTAS_PASAJERO_NOMBRE_RUTA + "='" + nombreRuta + "' AND " + NOMBRE_PARADERO_PASAJERO + "='" + nombreParadero + "' ;";

		Cursor cursor2 = db.rawQuery(query2, null);

		if (cursor2 != null ) 
		{
			boolean progreso2 = cursor2.moveToFirst();
			while(progreso2)
			{
				String estadisticaTomada = cursor2.getString(cursor2.getColumnIndex(DATO_TOMADO_PASAJERO));
				respuesta.add(new Estadistica(estadisticaTomada));

				progreso2 = cursor2.moveToNext();

			}
			cursor2.close();
		}


		return respuesta;

	}



}
